home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / utilit~1 / stlogin4.lzh / REBOOT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-29  |  3.1 KB  |  145 lines

  1. /* reboot program by Kees Lemmens; May 1993 */
  2.  
  3. /* version  1.1 : July 1993
  4.  
  5.     Non-existing devices caused bus-errors in wall function.
  6.     This made the program useless for users of non MEGA-STE
  7.     ATARI's. Sorry !!
  8.     It now checks to see if the device exists before sending
  9.     the shutdown messages to that device.
  10.  
  11.    version 1.2 : Sept 1993
  12.  
  13.     Reboot can only be run by uid 0 (root) from now on.
  14. */
  15.  
  16. #ifdef __PUREC__
  17. #include <tos.h>
  18. #else
  19. #include <osbind.h>
  20. #endif
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <stdarg.h>
  25. #include <time.h>
  26. #include <signal.h>
  27. #include "ux_misc.h"
  28.  
  29. #define WARM 0
  30. #define COLD 1
  31.  
  32. void domessage(char *msg,char *term,va_list ptr)
  33. {    FILE *fp;
  34.  
  35.     /* avoid adressing non-existing devices !!! */
  36.  
  37.     if((fp=fopen(term,"w")) == NULL)
  38.         return;    
  39.     vfprintf(fp,msg,ptr);
  40.     fclose(fp);
  41. }
  42.  
  43. void wall(char *msg,...)
  44. {    int t;
  45.     va_list ptr;
  46.     char **terms;
  47.     char *tosterms[]  = { "con:", "aux:", NULL };
  48.     char *mintterms[] = 
  49.     {    "u:\\dev\\console", "u:\\dev\\modem1" ,
  50.         "u:\\dev\\modem2" ,    "u:\\dev\\modem3" ,
  51.         "u:\\dev\\serial1", "u:\\dev\\serial2",
  52.         "u:\\dev\\serial3",  NULL
  53.     };
  54.     
  55.     if(RunningMint())
  56.         terms=mintterms;
  57.     else
  58.         terms = tosterms;
  59.  
  60.     va_start(ptr,msg);
  61.  
  62.     for(t=0;terms[t] != NULL; t++)
  63.         domessage(msg,terms[t],ptr);
  64.     va_end(ptr);
  65. }
  66.  
  67. void reset(int mode)
  68. {    long suret;
  69.     long *memvalid    = (long *)0x420L;
  70.     long *resvalid    = (long *)0x426L;
  71.     long *resetptr    = (long *)0x0004L;
  72.  
  73.     suret=Super(0L);
  74.     
  75.     if(*resvalid != 0x31415926L)
  76.     {    printf("\r\nReset vector invalid, reboot aborted");
  77.         exit(1);
  78.     }
  79.     else
  80.     {    if(mode == COLD) *memvalid = 0L;
  81.         Supexec((long (*)())(*resetptr));
  82.     }
  83.     Super((void *)suret);
  84. }
  85.  
  86. #define MINSZ 60
  87.  
  88. void main(int argc,char *argv[])
  89. {    time_t tstart,tend;
  90.     struct tm *ctm;
  91.     int susptm,x,coldfl=0,gap=5;
  92.     char *msg1=    "\n\n\t*** System shutdown message from root@atari ***"
  93.                 "\n\nSystem going down in %d minutes\n";
  94.     char *msg2=    "\n\n\t*** FINAL System shutdown message from"
  95.                 " root@atari ***\n\nSystem going down NOW !!"
  96.                 "\n\nSystem shutdown time has arrived\n";
  97.     char *msg3=    "\n\n\t*** System shutdown aborted !! ***\n\n";
  98.  
  99.     if(RunningMint())
  100.     {    if(Pgetuid() != 0)
  101.         {    printf("Not enough privileges to reboot system.\n");
  102.             exit(1);
  103.         }
  104.     }
  105.     x=argc;
  106.     while(--x>0)
  107.     {    if(*argv[1]=='-')
  108.         {    switch(*(++argv[1]))
  109.             {    case 'c':    coldfl=1; break;
  110.                 default:    printf("Usage= reboot [-c] [interval]\n");
  111.                             exit(1);
  112.             }
  113.             ++argv; --argc;
  114.         }
  115.     }    
  116.     if(argc>1) gap = atoi(argv[1]);
  117.     
  118.     time(&tstart);
  119.     tend = tstart + gap*MINSZ;
  120.     ctm=localtime(&tend);
  121.     printf("\nShutdown at %02d:%02d (in %d minutes)",
  122.             ctm->tm_hour,ctm->tm_min,gap);
  123.  
  124.     signal(SIGINT,SIG_IGN);
  125.     
  126.     while(time(&tstart) < tend)
  127.     {    wall(msg1,(int)((tend-tstart+2)/MINSZ));
  128.         susptm = (tend - tstart > 5*MINSZ) ? 5*MINSZ : MINSZ;
  129.         for(x=0;x<susptm;x+=5)
  130.         {    sleep(5);
  131.             if (Cconis())    /* provide escape on remote terminals */
  132.             {    if((int)Crawcin() == '\03')
  133.                 {    wall(msg3);
  134.                     exit(1);
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     wall(msg2);
  140.     sleep(3);    /* time to read console message ! */
  141.     
  142.     if(coldfl)     reset(COLD);
  143.     else reset(WARM);    
  144.     exit(0);
  145. }